package _tema6;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Cliente {
	private String serverHost;
	private int serverPort;
	private Socket socket;
	private ObjectOutputStream oos;
	private ObjectInputStream ois;
	
	public Cliente(String serverHost, int serverPort){
		this.serverHost = serverHost;
		this.serverPort = serverPort;
	}

	public void conectar() throws UnknownHostException, IOException{
		this.socket = new Socket(this.serverHost,this.serverPort);
		this.oos = new ObjectOutputStream(this.socket.getOutputStream());
		this.ois = new ObjectInputStream(this.socket.getInputStream());
	}

	public void desConectar() throws IOException{
		if (!this.socket.isClosed()){
			this.oos.close();
			this.ois.close();
			this.socket.close();
		}
	}

	public void enviarRequerimiento(Requerimiento r) throws Exception{
		this.oos.writeObject(r);
	}
	
	public Respuesta recibirRespuesta() throws Exception{
		return (Respuesta)this.ois.readObject();
	}

	public Respuesta obtenerSP() throws Exception {
		Requerimiento auxRequerimiento;
		auxRequerimiento = new Requerimiento();
		auxRequerimiento.setTipo(Requerimiento.CONECTAR);
		auxRequerimiento.setDato("Esperando Procedimientos...");
		this.enviarRequerimiento(auxRequerimiento);
		return this.recibirRespuesta();
	}

	public void cerrarConexion() throws Exception{
		Requerimiento auxRequerimiento;
		auxRequerimiento = new Requerimiento();
		auxRequerimiento.setTipo(Requerimiento.DESCONECTAR);
		auxRequerimiento.setDato("Se desconecto el cliente....");
		this.enviarRequerimiento(auxRequerimiento);
		this.desConectar();
	}

	public Respuesta ejecutarSP(String sp, int[] argumentos) throws Exception {
		Requerimiento auxRequerimiento;
		auxRequerimiento = new Requerimiento();
		auxRequerimiento.setTipo(Requerimiento.REQUERIR);
		auxRequerimiento.setDato(sp);
		auxRequerimiento.setArgumentos(argumentos);
		this.enviarRequerimiento(auxRequerimiento);
		return this.recibirRespuesta();
	}

}
